package com.xiefengf.rabbitmq.producer.service;

import cn.hutool.json.JSONUtil;
import com.rabbitmq.client.*;
import com.xiefengf.rabbitmq.producer.utils.StringUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.core.BatchingRabbitTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.concurrent.TimeoutException;

/**
 * @author xiefengf
 * @version 1.0
 * @date 2024/2/3 21:31
 *
 * 消息确认机制(事务+confirm)
 */
@Service
public class AckProductService {

    @Resource(name = "RabbitTemplate")
    private RabbitTemplate rabbitTemplate;

    /**
     * 普通发送消息 （测试批量消费消息）
     * @param userId
     * @param productId
     * @param msg
     */
//    @Transactional(rollbackFor = Exception.class, transactionManager = "rabbitTransactionManager")
    public void makeOrder1(Integer userId,Integer productId,String msg){
        HashMap<String, Object> map = new HashMap<>();
        map.put("userId",userId);
        map.put("productId",productId);
        map.put("msg",msg);
        rabbitTemplate.convertAndSend(StringUtils.DIRECT_ACK_EXCHANGE_NAME,StringUtils.DIRECT_ACK_KEY, JSONUtil.toJsonStr(map));
    }


}


/**
 * ------------------------------- 原始代码实现 -------------------
 */
///**
// * 生产者
// */
//public class ProductMsg {
//
//    public static void main(String[] args) throws IOException, TimeoutException {
//        // 获取RabbitMQ连接
//        Connection connection = RabbitUtils.getConn();
//        // 获取RabbitMQ信道
//        Channel channel = connection.createChannel();
//        // 声明队列
//        channel.queueDeclare("test_queue_tx",false,false,false,null);
//        // 需要发送的信息
//        String msg = "hello tx";
//        try {
//            // 开启事务
//            channel.txSelect();
//            // 发送消息
//            channel.basicPublish("","test_queue_tx",null,msg.getBytes());
//            // 模拟出现异常情况（除零异常）
//            int count = 1/0;
//            // 事务提交
//            channel.txCommit();
//        } catch (Exception e) {
//            // 回滚事务
//            channel.txRollback();
//        }finally {
//            // 释放资源
//            channel.close();
//            connection.close();
//        }
//    }
//}
//
///**
// * 消费者
// */
//public class ConsumerMsg {
//
//    public static void main(String[] args) throws IOException, TimeoutException {
//        // 获取RabbitMQ连接
//        Connection connection = RabbitUtils.getConn();
//        // 获取RabbitMQ信道
//        final Channel channel = connection.createChannel();
//        // 声明队列
//        channel.queueDeclare("test_queue_tx",false,false,false,null);
//        // 保证一次只发一个
//        channel.basicQos(1);
//        // ACK确认
//        boolean autoAck = true;
//        // 消费消息
//        channel.basicConsume("test_queue_tx",autoAck,new DefaultConsumer(channel){
//            @Override
//            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body){
//                String msg = new String(body, StandardCharsets.UTF_8);
//                System.out.println(msg);
//            }
//        });
//    }
//}
//
//
